/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.bo.AnaliseValorIndicadorBO;
import br.uniceub.fsw.indicadores.dao.AnaliseValorIndicadorDAO;
import br.uniceub.fsw.indicadores.vo.AnaliseValorIndicadorVO;
import br.uniceub.fsw.indicadores.bo.AcaoCorretivaBO;
import br.uniceub.fsw.indicadores.dao.AcaoCorretivaDAO;
import br.uniceub.fsw.indicadores.vo.AcaoCorretivaVO;
import br.uniceub.fsw.indicadores.bo.ValorIndicadorBO;
import br.uniceub.fsw.indicadores.dao.ValorIndicadorDAO;
import br.uniceub.fsw.indicadores.vo.ValorIndicadorVO;
import br.uniceub.fsw.indicadores.dao.IndicadorDAO;
import br.uniceub.fsw.indicadores.vo.IndicadorVO;
import br.uniceub.fsw.indicadores.dao.ObjetivoIndicadorDAO;
import br.uniceub.fsw.indicadores.vo.ObjetivoIndicadorVO;
import br.uniceub.fsw.indicadores.dao.ObjetivoDAO;
import br.uniceub.fsw.indicadores.vo.ObjetivoVO;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Facade da entidade analiseValorIndicador.
 * 
 * @author Filipe Scafuto Vieira ra 20463917
 * 
 */

public class AnaliseValorIndicadorFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;
    
    /**
     * Value object do indicador sendo analisado
     */
    private IndicadorVO indicador;

    /**
     * Value object do valor do indicador da análise
     */
    private ValorIndicadorVO valorIndicador;
        
    /**
     * Value object da análise do valor de indicador.
     */
    private AnaliseValorIndicadorVO analiseValorIndicador;
   
    /**
     * Value object da ação corretiva
     */
    private AcaoCorretivaVO acaoCorretiva;
    
    /**
     * Lista de valores de indicador
     */
    private List<List> valoresIndicador;    
    
    /**
     * Lista de ações corretivas da análise
     */
    private List<List> acoesCorretivas;    

    /**
     * Lista de objetivos do indicador sendo analisado
     */
    private List<List> objetivos;    

    /**
     * Lista de indicadores com resultado calculado
     */
    private List<List> indicadoresCalculados;    
    
    /**
     * Indicador de necessidade de ações corretivas para a análise
     */
    String indicadorAcaoCorretiva; 
    
    /**
     * Construtor da classe.
     */
    public AnaliseValorIndicadorFacade() {  
        

        this.indicadoresCalculados = new ArrayList<List>();

        IndicadorVO indExemplo = new IndicadorVO();
        indExemplo.setStIndicadorAtivo("S");
        List<IndicadorVO> inds = new IndicadorDAO().consultarIndicadoresComValor(indExemplo);
        for(int i = 0; i < inds.size(); i++) {
            List<String> temp = new ArrayList<String>();
            temp.add(inds.get(i).getIdIndicador().toString());
            temp.add(inds.get(i).getNoIndicador());            
            temp.add(inds.get(i).getDsIndicador());
            this.indicadoresCalculados.add(temp);
        }
        
        this.valoresIndicador = new ArrayList<List>();

        List<ValorIndicadorVO> vals = new ValorIndicadorDAO().consultarPorExemplo(new ValorIndicadorVO());
        for(int i = 0; i < vals.size(); i++) {
            List<String> temp = new ArrayList<String>();
            temp.add(vals.get(i).getIdValorIndicador().toString());
            temp.add(vals.get(i).getCdIndicador().toString());
            temp.add(vals.get(i).getIndicador().getNoIndicador());            
            temp.add(vals.get(i).getVlValorIndicador().toString());
            temp.add(vals.get(i).getIndicador().getDsUnidadeMedidaIndicador());
            temp.add(vals.get(i).getDtValorIndicadorString());            
            this.valoresIndicador.add(temp);
        }
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.isEmpty()) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }
    
    /**
     * Retorna a Análise do Valor do Indicador.
     * 
     * @return Objeto analiseValorIndicador.
     */
    public AnaliseValorIndicadorVO getAnaliseValorIndicador() {
        return this.analiseValorIndicador;
    }
    
    /**
     * Retorna o valor indicador da análise
     * 
     * @return Objeto valorIndicador.
     */
    public ValorIndicadorVO getValorIndicador() {
        return this.valorIndicador;
    }  
    
   /**
     * Retorna o indicador que está sendo analisado
     * 
     * @return Objeto indicador.
     */
    public IndicadorVO getIndicador() {
        return this.indicador;
    }     
    
    /**
     * Retorna os Valores de Indicador
     * 
     * @return Lista valoresIndicador
     */
    public List<List> getValoresIndicador() {
        return this.valoresIndicador;
    }    
    
    /**
     * Retorna os Indicadores que possuem resultados calculados
     * 
     * @return Lista indicadoresCalculados
     */
    public List<List> getIndicadoresCalculados() {
        return this.indicadoresCalculados;
    }      
    

    /**
     * Retorna as ações corretivas para a análise
     * 
     * @return Lista acoesCorretivas 
     */
    public List<List> getAcoesCorretivas() {
        return this.acoesCorretivas;
    }  
    
    /**
     * Retorna se a análise precisa de ações corretivas
     * 
     * @return String indicadorAcaoCorretiva
     */
    public String getIndicadorAcaoCorretiva() {
        return this.indicadorAcaoCorretiva;
    }  
    
    /**
     * Retorna os objetivos do indicador sendo analisado
     * 
     * @return Lista objetivos 
     */
    public List<List> getObjetivos() {
        return this.objetivos;
    }     
    
    /**
     * Retorna uma ação corretiva ligada a análise 
     * 
     * @return Object acaoCorretiva
     */
    public AcaoCorretivaVO getAcaoCorretiva() {
        return this.acaoCorretiva;
    }      
    
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");
        String mensagem = null;        

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);                
            }                
            if (oper.equals("analisar")) {                
                this.analisar(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }    
            if (oper.equals("definirAcoes")) {
                this.definir(req, resp, "incluir");
            } 
            if (oper.equals("alterarAcoes")) {
                this.definir(req, resp, "alterar");
            }             
        }
        if(req.getParameter("idIndicador") != null && req.getParameter("idIndicador").length() > 0) {
            try {
                indicador = new IndicadorDAO().consultarPorId(Integer.parseInt(req.getParameter("idIndicador")));
            }
            catch (NumberFormatException e) {             
            }
            
            this.valoresIndicador = new ArrayList<List>();
            ValorIndicadorVO viExemplo = new ValorIndicadorVO();
            viExemplo.setCdIndicador(Integer.parseInt(req.getParameter("idIndicador")));
            List<ValorIndicadorVO> vals = new ValorIndicadorDAO().consultarPorExemplo(viExemplo);
            for(int i = 0; i < vals.size(); i++) {
                List<String> temp = new ArrayList<String>();
                temp.add(vals.get(i).getIdValorIndicador().toString());
                temp.add(vals.get(i).getCdIndicador().toString());
                temp.add(vals.get(i).getIndicador().getNoIndicador());            
                temp.add(vals.get(i).getVlValorIndicador().toString());
                temp.add(vals.get(i).getIndicador().getDsUnidadeMedidaIndicador());
                temp.add(vals.get(i).getDtValorIndicadorString());            
                this.valoresIndicador.add(temp);
            }

            if(req.getParameter("idValorIndicador") != null && req.getParameter("idValorIndicador").length() > 0) {
                try {
                    valorIndicador = new ValorIndicadorDAO().consultarPorId(Integer.parseInt(req.getParameter("idValorIndicador")));
                }
                catch (NumberFormatException e) {             
                }

                try {
                    new ValorIndicadorBO().verificaLimites(valorIndicador);
                }
                catch(NegocioException e) {
                    mensagem = e.getMessage().replace("\n","<br />");
                    this.indicadorAcaoCorretiva = mensagem;
                }

                try {
                    AnaliseValorIndicadorVO anExemplo = new AnaliseValorIndicadorVO();
                    anExemplo.setCdValorIndicador(Integer.parseInt(req.getParameter("idValorIndicador")));
                    List<AnaliseValorIndicadorVO> analises = new AnaliseValorIndicadorDAO().consultarPorExemplo(anExemplo);
                    if (analises != null && analises.size() > 0)
                        for(int i = 0; i < analises.size(); i++) {   
                            analiseValorIndicador = analises.get(i);
                        }
                }
                catch (NumberFormatException e) {             
                }            

                if (analiseValorIndicador != null && analiseValorIndicador.getIdAnaliseValorIndicador() != null) {
                    this.acoesCorretivas = new ArrayList<List>();
                    AcaoCorretivaVO acaoExemplo = new AcaoCorretivaVO();
                    acaoExemplo.setCdAnaliseValorIndicador(analiseValorIndicador.getIdAnaliseValorIndicador());
                    List<AcaoCorretivaVO> acoes = new AcaoCorretivaDAO().consultarPorExemplo(acaoExemplo);
                    for(int i = 0; i < acoes.size(); i++) {
                        List<String> temp = new ArrayList<String>();
                        temp.add(acoes.get(i).getIdAcaoCorretiva().toString());
                        temp.add(acoes.get(i).getDsAcaoCorretiva());            
                        this.acoesCorretivas.add(temp);
                    }

                    this.objetivos = new ArrayList<List>();
                    ObjetivoIndicadorVO oiExemplo = new ObjetivoIndicadorVO();
                    oiExemplo.setCdIndicador(analiseValorIndicador.getValorIndicador().getCdIndicador());
                    List<ObjetivoIndicadorVO> objetivosIndicador = new ObjetivoIndicadorDAO().consultarPorExemplo(oiExemplo);
                    for(int i = 0; i < objetivosIndicador.size(); i++) {
                        ObjetivoVO objetivo = new ObjetivoDAO().consultarPorId(objetivosIndicador.get(i).getCdObjetivo());
                        ArrayList<String> temp = new ArrayList<String>();
                        temp.add(objetivo.getIdObjetivo().toString());
                        temp.add(objetivo.getNoObjetivo().toString());
                        objetivos.add(temp);
                    }
                }
            }            
        }
    }
  
    /**
     * Consultar uma análise de indicador
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        
        String idAnaliseValorIndicadorTmp = req.getParameter("idAnaliseValorIndicador");
        
        Integer idAnaliseValorIndicador = null;
        
        if(idAnaliseValorIndicadorTmp == null || idAnaliseValorIndicadorTmp.equals("")) {
            return;
        } else {
            idAnaliseValorIndicador = Integer.parseInt(idAnaliseValorIndicadorTmp);
        }
        this.analiseValorIndicador = new AnaliseValorIndicadorDAO().consultarPorId(idAnaliseValorIndicador);
    }    
   
    /**
     * Analisar um Valor de Indicador.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void analisar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null;

        analiseValorIndicador = new AnaliseValorIndicadorVO();

        try {
            analiseValorIndicador.setCdValorIndicador(Integer.parseInt(req.getParameter("idValorIndicador")));
            valorIndicador = new ValorIndicadorDAO().consultarPorId(analiseValorIndicador.getCdValorIndicador());
            indicador = new IndicadorDAO().consultarPorId(valorIndicador.getCdIndicador());            
        }
        catch (NumberFormatException e) {             
        }
        analiseValorIndicador.setDtAnaliseValorIndicador(new Date());
        analiseValorIndicador.setDsAnaliseValorIndicador(req.getParameter("dsAnaliseValorIndicador").trim());

        try {
            new AnaliseValorIndicadorBO().validaAnaliseValorIndicador(analiseValorIndicador,true);
        }
        catch(NegocioException e) {
            mensagem = e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = e.getMessage();
        }

        if(mensagem == null) {            
            try {
                Transacao.iniciar();
                new AnaliseValorIndicadorDAO().inserir(analiseValorIndicador);
                Transacao.efetivar();
                mensagem = "Análise do valor do indicador incluída com sucesso.";    
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na inclusão da análise do valor do indicador: " + ex.getMessage();
            }
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar uma análise do valor de indicador.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null;
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");        
        
        analiseValorIndicador = new AnaliseValorIndicadorVO();
        try {
            analiseValorIndicador.setCdValorIndicador(Integer.parseInt(req.getParameter("idValorIndicador")));
            valorIndicador = new ValorIndicadorDAO().consultarPorId(analiseValorIndicador.getCdValorIndicador());
            indicador = new IndicadorDAO().consultarPorId(valorIndicador.getCdIndicador());            
        }
        catch (NumberFormatException e) {             
        }        
        try {
            if(!req.getParameter("dtAnaliseValorIndicador").trim().isEmpty()) 
                analiseValorIndicador.setDtAnaliseValorIndicador(sdf.parse(req.getParameter("dtAnaliseValorIndicador").trim()));
        }        
        catch (ParseException e) {   
        }
        analiseValorIndicador.setDsAnaliseValorIndicador(req.getParameter("dsAnaliseValorIndicador").trim());
        try {
            analiseValorIndicador.setIdAnaliseValorIndicador(Integer.parseInt(req.getParameter("idAnaliseValorIndicador")));
        }
        catch (NumberFormatException e) {
        }        
      
        try {
            new AnaliseValorIndicadorBO().validaAnaliseValorIndicador(analiseValorIndicador,false);
        }
        catch(NegocioException e) {
            mensagem = e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = e.getMessage();
        }
        
        if(mensagem == null) {            
            try {
                Transacao.iniciar();
                new AnaliseValorIndicadorDAO().alterar(analiseValorIndicador);
                Transacao.efetivar();
                mensagem = "Análise do valor do indicador alterada com sucesso.";                
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na alteração da análise do valor do indicador: " + ex.getMessage();
            }
        }
         
        this.message = mensagem;
    }
  
    public void definir(HttpServletRequest req, HttpServletResponse resp, String opcao) {
        String mensagem = null;

        analiseValorIndicador = new AnaliseValorIndicadorVO();
        acaoCorretiva = new AcaoCorretivaVO();

        if (opcao.equals("incluir"))
            try {
                acaoCorretiva.setCdAnaliseValorIndicador(Integer.parseInt(req.getParameter("idAnaliseValorIndicador")));
                analiseValorIndicador = new AnaliseValorIndicadorDAO().consultarPorId(acaoCorretiva.getCdAnaliseValorIndicador());
                valorIndicador = new ValorIndicadorDAO().consultarPorId(analiseValorIndicador.getCdValorIndicador());
                indicador = new IndicadorDAO().consultarPorId(valorIndicador.getCdIndicador());            
            }
            catch (NumberFormatException e) {             
            }
        if (opcao.equals("alterar"))
            try {
                acaoCorretiva = new AcaoCorretivaDAO().consultarPorId(Integer.parseInt(req.getParameter("idAcaoCorretiva")));
            }
            catch (NumberFormatException e) {             
            }
                
        acaoCorretiva.setDsAcaoCorretiva(req.getParameter("dsAcaoCorretiva").trim());

        try {
            new AcaoCorretivaBO().validaAcaoCorretiva(acaoCorretiva);
        }
        catch(NegocioException e) {
            mensagem = e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = e.getMessage();
        }

        if(mensagem == null) {            
            try {
                Transacao.iniciar();
                if (opcao.equals("incluir")) {
                    new AcaoCorretivaDAO().inserir(acaoCorretiva);
                    mensagem = "Ação corretiva incluída com sucesso.";                   
                }
                if (opcao.equals("alterar")) {
                    new AcaoCorretivaDAO().alterar(acaoCorretiva);
                    mensagem = "Ação corretiva alterada com sucesso.";                        
                }
                Transacao.efetivar();
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na inclusão da ação corretiva: " + ex.getMessage();
            }
        }
        
        this.message = mensagem;
    }    

}